// 引用axios
var axios = require('axios')

// 设置请求超时时间300s
axios.defaults.timeout = 300000;

axios.defaults.baseURL = 'http://localhost:7000/api';

axios.defaults.withCredentials = true;

// 设置post请求头
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';

// 请求拦截
axios.interceptors.request.use( config => {

    //登陆请求直接放行
    if(config.url === "loginController/login"){
        return config;
    }

    //非登陆请求读取token信息,将token信息添加到请求头中
    var storage=window.localStorage;
    var chamToken = storage.getItem("chamToken");
    config.headers.token = chamToken;
    return config;
}, error => {
    // 对请求错误做些什么
    // tryHideFullScreenLoading();
    // Message.error({ message: '请求超时!' })
    return Promise.error(error);
});

// 响应拦截
axios.interceptors.response.use( response => {
    //当token不为空且是登陆地址的情况下,将Token填入localStorage中
    if(response.data.chamToken!=null && response.config.url === "pdm-service/loginController/login"){
        var chamToken = response.data.chamToken;
        var userHeadImg = response.data.userHeadImg;
        var storage=window.localStorage;
        storage.setItem("chamToken",chamToken);
        storage.setItem("userHeadImg",userHeadImg);
    }
    return response;
}, error => {
    // 对响应错误做点什么
    // tryHideFullScreenLoading();
    return Promise.reject(error);
});

// 自定义判断元素类型JS
function toType (obj) {
    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
// 参数过滤函数
function filterNull (o) {
    for (var key in o) {
        if (o[key] === null) {
            delete o[key]
        }
        if (toType(o[key]) === 'string') {
            o[key] = o[key].trim()
        } else if (toType(o[key]) === 'object') {
            o[key] = filterNull(o[key])
        } else if (toType(o[key]) === 'array') {
            o[key] = filterNull(o[key])
        }
    }
    return o
}

/*
  接口处理函数
  这个函数每个项目都是不一样的，我现在调整的是适用于
  https://cnodejs.org/api/v1 的接口，如果是其他接口
  需要根据接口的参数进行调整。参考说明文档地址：
  https://cnodejs.org/topic/5378720ed6e2d16149fa16bd
  主要是，不同的接口的成功标识和失败提示是不一致的。
  另外，不同的项目的处理方法也是不一致的，这里出错就是简单的alert
*/
function apiAxios (method, url, params, success, failure) {

    if (params) {
        params = filterNull(params)
    }
    axios({
        method: method,
        url: url,
        data: method === 'POST' || method === 'PUT' ? params : null,
        params: method === 'GET' || method === 'DELETE' ? params : null,
        //允许跨域
        // withCredentials: true
    })
        .then(function (res) {
            //如果返回的状态为200，代表执行成功
            if (res.status === 200) {
                if (success) {
                    success(res.data)
                }
            } else {
                if (failure) {
                    failure(res.data)
                } else {
                    window.alert('error: ' + JSON.stringify(res.data))
                }
            }
        })
        .catch(function (err) {
            let res = err.response;
            failure(res.data);
            // if (err) {
            //     window.alert('api error, HTTP CODE: ' + res.status)
            // }
        })
}

// 返回在vue模板中的调用接口
export default {
    get: function (url, params, success, failure) {
        return apiAxios('GET', url, params, success, failure)
    },
    post: function (url, params, success, failure) {
        return apiAxios('POST', url, params, success, failure)
    },
    put: function (url, params, success, failure) {
        return apiAxios('PUT', url, params, success, failure)
    },
    delete: function (url, params, success, failure) {
        return apiAxios('DELETE', url, params, success, failure)
    }
}
